package com.quyunshuo.module.home.view;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.widget.AppCompatTextView;

import com.quyunshuo.module.home.R;

public class ColorTrackTextView extends AppCompatTextView {
    //默认单位是px
    int textSize = 100; //如何转换呢？？？？？
    //绘制不变色字体的画笔
    private Paint mOriginPaint;
    //绘制变色字体的画笔
    private Paint mChangePaint;

    public void setCurrentPro(float currentPro) {
        this.currentPro = currentPro;
        invalidate();
    }

    //当前变色的进度
    private float currentPro = 0.5f;

    public ColorTrackTextView(@NonNull Context context) {
        this(context, null);//为什么要换呢？
    }


    public ColorTrackTextView(@NonNull Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public ColorTrackTextView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initPaint(context, attrs);
    }

    private void initPaint(Context context, AttributeSet attrs) {
        //通过TypedArray把自定义属性拿过来
        TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.ColorTrackTextView);

        // 拿到属性。如果不知道如何获取，就看源码
        int originColor = typedArray.getColor(R.styleable.ColorTrackTextView_originColor,
                getTextColors().getDefaultColor());
        int changeColor = typedArray.getColor(R.styleable.ColorTrackTextView_changeColor,
                getTextColors().getDefaultColor());

        //一定要记得回收。为什么要回收，因为不回收，性能会很差。为什么呢？？？
        typedArray.recycle();

        mOriginPaint = getPaintByColor(originColor);
        mChangePaint = getPaintByColor(changeColor);

    }

    private Paint getPaintByColor(int color) {
        Paint paint = new Paint();
        paint.setColor(color);//设置颜色
        paint.setAntiAlias(true);//设置抗锯齿，一般都要设置
        paint.setDither(true);//设置放抖动，一般都要设置
        paint.setTextSize(getTextSize());//设置字体大小，textview的字体大小。
        return paint;
    }

    @Override
    protected void onDraw(Canvas canvas) {
//        super.onDraw(canvas);//去掉，我们自己绘制
        int currentPoint = (int)(currentPro*getWidth());

        drawText(canvas,mOriginPaint,0,currentPoint);
        drawText(canvas,mChangePaint,currentPoint,getWidth());


    }

    private void drawText(Canvas canvas, Paint paint, int start, int end) {
        Log.d("drawText", "drawText: "+start+",,"+end);
        /*
            在 Android 的绘制流程中，​​裁剪（clipRect）仅影响绘制结果的显示区域​​，而​​文本区域的计算
            （getTextBounds）是基于文本本身的属性（如字体大小、内容等）​​，与裁剪无关。
            想象你在纸上写了一段文字：

            ​​裁剪​​：用剪刀剪掉纸的一部分，只保留左半张纸。
            ​​测量文字区域​​：用尺子测量整段文字的原始尺寸（包括被剪掉的部分），结果仍然是完整的。
            ​​实际显示​​：你只能看到左半张纸上的文字，但尺子测量的结果不会改变。
         */
        canvas.save();//保存原始状态,方便后续重新绘制。因为如果不保存，那么区域就会固定住了，比如本来是1000k，后面设置了100，那么后续只能再100里面绘制了。
        Rect rect = new Rect(start,0,end,getHeight());
        canvas.clipRect(rect);//将后续绘制内容限制在此矩形区域内（只有这个区域会被绘制）。

        String text = getText().toString();

        if (TextUtils.isEmpty(text)) {
            return;
        }

        //获取文字的区域，，，，啥意思
        Rect bounds = new Rect();//获取文字区域到这里？？？
        paint.getTextBounds(text, 0, text.length(), bounds);//获取text，从0到尾的区域，给到bounds

        //获取x坐标  啥意思
        int dx = getWidth() / 2 - bounds.width() / 2;//居中的一个效果。
        Log.d("1", "onDraw: " + dx + "," + getWidth() + "," + bounds.width());//onDraw: 348,900,204
        //获取基线    啥意思 baseline
        /*
                getFontMetricsInt  获取到文字的最大宽高，因为有法语，中文等。
         */
        Paint.FontMetricsInt fontMetricsInt = paint.getFontMetricsInt();//因为我们拿不到，文字的基线位置，需要自己计算
        int dy = (fontMetricsInt.bottom - fontMetricsInt.top) / 2 - fontMetricsInt.bottom;
        int baseLine = getHeight() / 2 + dy;
        Log.d("2", "onDraw: " + fontMetricsInt.bottom + "," + fontMetricsInt.top + "," + getHeight() + "," + baseLine);//onDraw: 12,-45,57,44

        //绘制文字
        canvas.drawText(text, dx, baseLine, paint);//x和y如何设置呢？

        canvas.restore();//清空 中间的绘制效果。
    }
}
